package com.ypinkj.app.utils;

import lombok.Data;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Type;

/**
 * 　　　　　　　 ┏┓       ┏┓+ +
 * 　　　　　　　┏┛┻━━━━━━━┛┻┓ + +
 * 　　　　　　　┃　　　　　　 ┃
 * 　　　　　　　┃　　　━　　　┃ ++ + + +
 * 　　　　　　 █████━█████  ┃+
 * 　　　　　　　┃　　　　　　 ┃ +
 * 　　　　　　　┃　　　┻　　　┃
 * 　　　　　　　┃　　　　　　 ┃ + +
 * 　　　　　　　┗━━┓　　　 ┏━┛
 * ┃　　  ┃
 * 　　　　　　　　　┃　　  ┃ + + + +
 * 　　　　　　　　　┃　　　┃　Code is far away from     bug with the animal protecting
 * 　　　　　　　　　┃　　　┃ + 　　　　         神兽保佑,代码无bug
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃　　+
 * 　　　　　　　　　┃　 　 ┗━━━┓ + +
 * 　　　　　　　　　┃ 　　　　　┣┓
 * 　　　　　　　　　┃ 　　　　　┏┛
 * 　　　　　　　　　┗┓┓┏━━━┳┓┏┛ + + + +
 * 　　　　　　　　　 ┃┫┫　 ┃┫┫
 * 　　　　　　　　　 ┗┻┛　 ┗┻┛+ + + +
 * 版权：陇朝赢科技有限公司 版权所有
 *
 * @author 文凯
 * 版本：${Version}
 * 创建日期：2020/10/22
 * 描述：${des}
 * ClassName：GetObjectIsNull
 * PackageName:com.ypinkj.app.utils
 *
 * 获取对象中的属性 是否存在 null的值
 *
 */
public class GetObjectIsNull {

    /**
     * description:定义一个System.out.println的开（纯属个人习惯）
     **/
    private static int objectNullSystemOutFlag = 0;

    /**
     * description:判断当前对象是否为空（包括所有属性为空）
     *
     * @author ZhangXihui
     * @param object 入参类
     * @return boolean
     * @create 2019/6/3 17:34
     **/
    public static boolean objCheckIsNull(Object object) {
        if (object == null) {
            return true;
        }
        // 得到类对象
        Class clazz = object.getClass();
        // 得到所有属性
        Field[] fields = clazz.getDeclaredFields();

        System.out.println("对象属性有:"+fields.length);
        //定义返回结果，默认为true
        boolean flag = true;
        for (Field field : fields) {
            //设置权限（很重要，否则获取不到private的属性，不了解的同学补习一下反射知识）
            field.setAccessible(true);
            Object fieldValue = null;
            String fieldName = null;
            try {
                //得到属性值
                fieldValue = field.get(object);
                //得到属性类型
                Type fieldType = field.getGenericType();
                //得到属性名
                fieldName = field.getName();
                //打印输出(调试用可忽略)
                if (objectNullSystemOutFlag == 0) {
                    System.out.println("属性类型：" + fieldType + ",属性名：" + fieldName + ",属性值：" + fieldValue);
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
            //只要有一个属性值不为null 就返回false 表示对象不为null
            if (fieldValue == null) {
                System.out.println("有null存在");
                flag = false;
                break;
            }
        }
        return flag;
    }
    public static void main(String[] args) {
        @ToString
        @Data
        class User {
            private String username;
            private String password;
            private String phone;

            public User() {
            }

            public User(String username, String password) {
                this.username = username;
                this.password = password;
            }
        }

        User user = new User();
        user.setPassword("123213");
        user.setUsername("123123123");
        user.setPhone("122122");

        System.out.println(user);
        //正常判断
        System.out.println(user == null);
        //使用反射的工具类
        System.out.println("是否存在null值:"+ GetObjectIsNull.objCheckIsNull(user));
    }

}
